#include<iostream>

class Base
{
    public:
       virtual void show()//虚函数
        {
            std::cout<<"Base\n";
        }
};
class Derived1:public Base
{
public:
    void show()
    {
        std::cout<<"Derived1\n";
    }


};
class Derived2:public Base
{
public:
    void show()
    {
        std::cout<<"Derived2\n";
    }


};
int main()
{


    Derived1 *d1=new Derived1;
    Derived2 *d2=new Derived2;
    // d1->show();
    // d2->show();

    //c++允许将子类指针转成基类指针：向上转型
    Base *b=d1;
    b->show();
    b=d2;
    b->show();
   


    //Derived1 *t=b1;//向下转型：基类指针转换成子类指针：不被允许


    //多态:同一句代码，不同的功能
    //c++多态：
    //1.基类指针指向子类对象
    //2.基类定义虚函数
    //3.子类重写，父类虚函数
    //子类函数和父类函数完全相同：重写

    //重写  和名词遮蔽
    //名词遮蔽：父类函数和子类函数同名，子类无法调用父类同名函数

    //虚函数为什么能实现多态？
  // 重点：虚函数指针和虚函数表，每一个对象塞了一个虚函数指针，每一个类都有虚函数表，当对象是什么时，指针会随着对象虚函数指针指向虚函数表。
    return 0;
}